जावास्क्रिप्ट डेकोरेटर्सचा सखोल अभ्यास, त्यांची सिंटॅक्स, मेटाडेटा प्रोग्रामिंगसाठी उपयोग, सर्वोत्तम पद्धती आणि कोडच्या सुव्यवस्थिततेवरील परिणाम शोधणे. यात व्यावहारिक उदाहरणे आणि भविष्यातील विचार समाविष्ट आहेत.
जावास्क्रिप्ट डेकोरेटर्स: मेटाडेटा प्रोग्रामिंगची अंमलबजावणी
जावास्क्रिप्ट डेकोरेटर्स एक शक्तिशाली वैशिष्ट्य आहे जे तुम्हाला मेटाडेटा जोडण्याची आणि क्लासेस, मेथड्स, प्रॉपर्टीज आणि पॅरामीटर्सच्या वर्तनात घोषणात्मक आणि पुन्हा वापरण्यायोग्य पद्धतीने बदल करण्याची परवानगी देते. हे ECMAScript मानकांच्या प्रक्रियेत स्टेज 3 प्रस्ताव आहे आणि टाइपस्क्रिप्टसोबत मोठ्या प्रमाणावर वापरले जाते, ज्याची स्वतःची (थोडी वेगळी) अंमलबजावणी आहे. हा लेख जावास्क्रिप्ट डेकोरेटर्सचे सर्वसमावेशक विहंगावलोकन देईल, मेटाडेटा प्रोग्रामिंगमधील त्यांच्या भूमिकेवर लक्ष केंद्रित करेल आणि व्यावहारिक उदाहरणांसह त्यांचा वापर स्पष्ट करेल.
जावास्क्रिप्ट डेकोरेटर्स म्हणजे काय?
डेकोरेटर्स एक डिझाइन पॅटर्न आहे जो ऑब्जेक्टची रचना न बदलता त्याची कार्यक्षमता वाढवतो किंवा सुधारतो. जावास्क्रिप्टमध्ये, डेकोरेटर्स हे विशेष प्रकारचे डिक्लरेशन आहेत जे क्लासेस, मेथड्स, ॲक्सेसर्स, प्रॉपर्टीज किंवा पॅरामीटर्सना जोडले जाऊ शकतात. ते @ चिन्हाचा वापर करतात आणि त्यानंतर एक फंक्शन येतो जे डेकोरेटेड एलिमेंट परिभाषित केल्यावर कार्यान्वित होते.
डेकोरेटर्सना फंक्शन्स म्हणून समजा जे डेकोरेटेड एलिमेंटला इनपुट म्हणून घेतात आणि त्या एलिमेंटची सुधारित आवृत्ती परत करतात, किंवा त्यावर आधारित काही साईड इफेक्ट करतात. हे मूळ क्लास किंवा फंक्शनमध्ये थेट बदल न करता कार्यक्षमता जोडण्याचा एक स्वच्छ आणि मोहक मार्ग प्रदान करते.
मुख्य संकल्पना:
- डेकोरेटर फंक्शन:
@चिन्हाच्या आधी असलेले फंक्शन. हे डेकोरेटेड एलिमेंटबद्दल माहिती प्राप्त करते आणि त्यात बदल करू शकते. - डेकोरेटेड एलिमेंट: क्लास, मेथड, ॲक्सेसर, प्रॉपर्टी किंवा पॅरामीटर ज्याला डेकोरेट केले जाते.
- मेटाडेटा: डेटा जो डेटाचे वर्णन करतो. डेकोरेटर्सचा वापर अनेकदा कोड एलिमेंट्ससोबत मेटाडेटा जोडण्यासाठी केला जातो.
सिंटॅक्स आणि रचना
डेकोरेटरचा मूलभूत सिंटॅक्स खालीलप्रमाणे आहे:
@decorator
class MyClass {
// Class members
}
येथे, @decorator हे डेकोरेटर फंक्शन आहे आणि MyClass हे डेकोरेटेड क्लास आहे. जेव्हा क्लास परिभाषित केला जातो तेव्हा डेकोरेटर फंक्शनला कॉल केला जातो आणि ते क्लासच्या व्याख्येपर्यंत पोहोचू शकते आणि त्यात बदल करू शकते.
डेकोरेटर्स आर्गुमेंट्स देखील स्वीकारू शकतात, जे डेकोरेटर फंक्शनलाच दिले जातात:
@loggable(true, "Custom Message")
class MyClass {
// Class members
}
या प्रकरणात, loggable एक डेकोरेटर फॅक्टरी फंक्शन आहे, जे आर्गुमेंट्स घेते आणि वास्तविक डेकोरेटर फंक्शन परत करते. यामुळे अधिक लवचिक आणि कॉन्फिगर करण्यायोग्य डेकोरेटर्स बनवता येतात.
डेकोरेटर्सचे प्रकार
डेकोरेटर्सचे विविध प्रकार आहेत, ते कशाला डेकोरेट करतात यावर अवलंबून:
- क्लास डेकोरेटर्स: क्लासेसना लागू केले जातात.
- मेथड डेकोरेटर्स: क्लासमधील मेथड्सना लागू केले जातात.
- ॲक्सेसर डेकोरेटर्स: गेटर आणि सेटर ॲक्सेसर्सना लागू केले जातात.
- प्रॉपर्टी डेकोरेटर्स: क्लास प्रॉपर्टीजना लागू केले जातात.
- पॅरामीटर डेकोरेटर्स: मेथडच्या पॅरामीटर्सना लागू केले जातात.
क्लास डेकोरेटर्स
क्लास डेकोरेटर्सचा वापर क्लासच्या वर्तनात बदल किंवा वाढ करण्यासाठी केला जातो. ते क्लास कन्स्ट्रक्टरला आर्गुमेंट म्हणून घेतात आणि मूळ कन्स्ट्रक्टरच्या जागी नवीन कन्स्ट्रक्टर परत करू शकतात. हे तुम्हाला लॉगिंग, डिपेंडेंसी इंजेक्शन किंवा स्टेट मॅनेजमेंटसारखी कार्यक्षमता जोडण्यास सक्षम करते.
उदाहरण:
function loggable(constructor: Function) {
console.log("Class " + constructor.name + " was created.");
}
@loggable
class User {
name: string;
constructor(name: string) {
this.name = name;
}
}
const user = new User("Alice"); // आउटपुट: Class User was created.
या उदाहरणात, loggable डेकोरेटर जेव्हा User क्लासची नवीन इंस्टन्स तयार होते तेव्हा कन्सोलवर एक संदेश लॉग करतो. हे डीबगिंग किंवा मॉनिटरिंगसाठी उपयुक्त ठरू शकते.
मेथड डेकोरेटर्स
मेथड डेकोरेटर्सचा वापर क्लासमधील मेथडच्या वर्तनात बदल करण्यासाठी केला जातो. त्यांना खालील आर्गुमेंट्स मिळतात:
target: क्लासचा प्रोटोटाइप.propertyKey: मेथडचे नाव.descriptor: मेथडसाठी प्रॉपर्टी डिस्क्रिप्टर.
डिस्क्रिप्टर तुम्हाला मेथडच्या वर्तनात प्रवेश आणि बदल करण्याची परवानगी देतो, जसे की त्यात अतिरिक्त लॉजिक समाविष्ट करणे किंवा ते पूर्णपणे पुन्हा परिभाषित करणे.
उदाहरण:
function logMethod(target: any, propertyKey: string, descriptor: PropertyDescriptor) {
const originalMethod = descriptor.value;
descriptor.value = function (...args: any[]) {
console.log(`Calling method ${propertyKey} with arguments: ${args}`);
const result = originalMethod.apply(this, args);
console.log(`Method ${propertyKey} returned: ${result}`);
return result;
};
return descriptor;
}
class Calculator {
@logMethod
add(a: number, b: number): number {
return a + b;
}
}
const calculator = new Calculator();
const sum = calculator.add(5, 3); // मेथड कॉल आणि रिटर्न व्हॅल्यूसाठी लॉग आउटपुट करते
या उदाहरणात, logMethod डेकोरेटर मेथडचे आर्गुमेंट्स आणि रिटर्न व्हॅल्यू लॉग करतो. हे डीबगिंग आणि परफॉर्मन्स मॉनिटरिंगसाठी उपयुक्त ठरू शकते.
ॲक्सेसर डेकोरेटर्स
ॲक्सेसर डेकोरेटर्स मेथड डेकोरेटर्ससारखेच असतात परंतु ते गेटर आणि सेटर ॲक्सेसर्सवर लागू केले जातात. त्यांना मेथड डेकोरेटर्ससारखेच आर्गुमेंट्स मिळतात आणि ते तुम्हाला ॲक्सेसरच्या वर्तनात बदल करण्याची परवानगी देतात.
उदाहरण:
function validate(target: any, propertyKey: string, descriptor: PropertyDescriptor) {
const originalSet = descriptor.set;
descriptor.set = function (value: any) {
if (value < 0) {
throw new Error("Value must be non-negative.");
}
originalSet.call(this, value);
};
}
class Temperature {
private _celsius: number;
constructor(celsius: number) {
this._celsius = celsius;
}
@validate
set celsius(value: number) {
this._celsius = value;
}
get celsius(): number {
return this._celsius;
}
}
const temperature = new Temperature(25);
temperature.celsius = 30; // वैध
// temperature.celsius = -10; // त्रुटी फेकते
या उदाहरणात, validate डेकोरेटर हे सुनिश्चित करतो की तापमानाचे मूल्य ऋण नाही. हे डेटा अखंडता लागू करण्यासाठी उपयुक्त ठरू शकते.
प्रॉपर्टी डेकोरेटर्स
प्रॉपर्टी डेकोरेटर्सचा वापर क्लास प्रॉपर्टीच्या वर्तनात बदल करण्यासाठी केला जातो. त्यांना खालील आर्गुमेंट्स मिळतात:
target: क्लासचा प्रोटोटाइप (इंस्टन्स प्रॉपर्टीजसाठी) किंवा क्लास कन्स्ट्रक्टर (स्टॅटिक प्रॉपर्टीजसाठी).propertyKey: प्रॉपर्टीचे नाव.
प्रॉपर्टी डेकोरेटर्सचा वापर मेटाडेटा परिभाषित करण्यासाठी किंवा प्रॉपर्टीच्या डिस्क्रिप्टरमध्ये बदल करण्यासाठी केला जाऊ शकतो.
उदाहरण:
function readonly(target: any, propertyKey: string) {
Object.defineProperty(target, propertyKey, {
writable: false,
});
}
class Configuration {
@readonly
apiUrl: string = "https://api.example.com";
}
const config = new Configuration();
// config.apiUrl = "https://newapi.example.com"; // स्ट्रिक्ट मोडमध्ये त्रुटी फेकते
या उदाहरणात, readonly डेकोरेटर apiUrl प्रॉपर्टीला फक्त-वाचनीय बनवतो, ज्यामुळे ते सुरू केल्यानंतर त्यात बदल करता येत नाही. हे अपरिवर्तनीय कॉन्फिगरेशन मूल्ये परिभाषित करण्यासाठी उपयुक्त ठरू शकते.
पॅरामीटर डेकोरेटर्स
पॅरामीटर डेकोरेटर्सचा वापर मेथड पॅरामीटरच्या वर्तनात बदल करण्यासाठी केला जातो. त्यांना खालील आर्गुमेंट्स मिळतात:
target: क्लासचा प्रोटोटाइप (इंस्टन्स मेथड्ससाठी) किंवा क्लास कन्स्ट्रक्टर (स्टॅटिक मेथड्ससाठी).propertyKey: मेथडचे नाव.parameterIndex: मेथडच्या पॅरामीटर सूचीमधील पॅरामीटरचा इंडेक्स.
पॅरामीटर डेकोरेटर्स इतर प्रकारच्या डेकोरेटर्सपेक्षा कमी वापरले जातात, परंतु ते इनपुट पॅरामीटर्सची तपासणी करण्यासाठी किंवा डिपेंडेंसी इंजेक्ट करण्यासाठी उपयुक्त ठरू शकतात.
उदाहरण:
function required(target: any, propertyKey: string, parameterIndex: number) {
const existingRequiredParameters: number[] = Reflect.getOwnMetadata(propertyKey, target, "required") || [];
existingRequiredParameters.push(parameterIndex);
Reflect.defineMetadata(propertyKey, existingRequiredParameters, target, "required");
}
function validateMethod(target: any, propertyName: string, descriptor: PropertyDescriptor) {
let method = descriptor.value!;
descriptor.value = function () {
let requiredParameters: number[] = Reflect.getOwnMetadata(propertyName, target, "required");
if (requiredParameters) {
for (let parameterIndex of requiredParameters) {
if (arguments[parameterIndex] === null || arguments[parameterIndex] === undefined) {
throw new Error(`Missing required argument at index ${parameterIndex}`);
}
}
}
return method.apply(this, arguments);
};
}
class ArticleService {
create(
@required title: string,
@required content: string
): void {
console.log(`Creating article with title: ${title} and content: ${content}`);
}
}
const service = new ArticleService();
// service.create("My Article", null); // त्रुटी फेकते
service.create("My Article", "Article Content"); // वैध
या उदाहरणात, required डेकोरेटर पॅरामीटर्सना आवश्यक म्हणून चिन्हांकित करतो आणि validateMethod डेकोरेटर हे सुनिश्चित करतो की हे पॅरामीटर्स null किंवा undefined नाहीत. हे मेथड इनपुट व्हॅलिडेशन लागू करण्यासाठी उपयुक्त ठरू शकते.
डेकोरेटर्ससह मेटाडेटा प्रोग्रामिंग
डेकोरेटर्सच्या सर्वात शक्तिशाली उपयोगांपैकी एक म्हणजे मेटाडेटा प्रोग्रामिंग. मेटाडेटा म्हणजे डेटाबद्दलचा डेटा. प्रोग्रामिंगच्या संदर्भात, तो असा डेटा आहे जो तुमच्या कोडची रचना, वर्तन आणि उद्देश यांचे वर्णन करतो. डेकोरेटर्स क्लासेस, मेथड्स, प्रॉपर्टीज आणि पॅरामीटर्ससोबत मेटाडेटा जोडण्याचा एक स्वच्छ आणि घोषणात्मक मार्ग प्रदान करतात.
रिफ्लेक्ट मेटाडेटा API
रिफ्लेक्ट मेटाडेटा API एक मानक API आहे जे तुम्हाला ऑब्जेक्ट्सशी संबंधित मेटाडेटा संग्रहित आणि पुनर्प्राप्त करण्याची परवानगी देते. ते खालील फंक्शन्स प्रदान करते:
Reflect.defineMetadata(key, value, target, propertyKey): ऑब्जेक्टच्या विशिष्ट प्रॉपर्टीसाठी मेटाडेटा परिभाषित करते.Reflect.getMetadata(key, target, propertyKey): ऑब्जेक्टच्या विशिष्ट प्रॉपर्टीसाठी मेटाडेटा पुनर्प्राप्त करते.Reflect.hasMetadata(key, target, propertyKey): ऑब्जेक्टच्या विशिष्ट प्रॉपर्टीसाठी मेटाडेटा अस्तित्वात आहे की नाही हे तपासते.Reflect.deleteMetadata(key, target, propertyKey): ऑब्जेक्टच्या विशिष्ट प्रॉपर्टीसाठी मेटाडेटा हटवते.
तुम्ही या फंक्शन्सचा वापर डेकोरेटर्ससोबत तुमच्या कोड एलिमेंट्ससोबत मेटाडेटा जोडण्यासाठी करू शकता.
उदाहरण: मेटाडेटा परिभाषित करणे आणि पुनर्प्राप्त करणे
import 'reflect-metadata';
const logKey = "log";
function log(message: string) {
return function (target: any, key: string, descriptor: PropertyDescriptor) {
Reflect.defineMetadata(logKey, message, target, key);
const originalMethod = descriptor.value;
descriptor.value = function (...args: any[]) {
console.log(Reflect.getMetadata(logKey, target, key));
const result = originalMethod.apply(this, args);
return result;
}
return descriptor;
}
}
class Example {
@log("Executing method")
myMethod(arg: string): string {
return `Method called with ${arg}`;
}
}
const example = new Example();
example.myMethod("Hello"); // आउटपुट: Executing method, Method called with Hello
या उदाहरणात, log डेकोरेटर रिफ्लेक्ट मेटाडेटा API चा वापर करून myMethod मेथडसोबत एक लॉग मेसेज जोडतो. जेव्हा मेथडला कॉल केला जातो, तेव्हा डेकोरेटर मेसेज पुनर्प्राप्त करतो आणि कन्सोलवर लॉग करतो.
मेटाडेटा प्रोग्रामिंगसाठी उपयोग
डेकोरेटर्ससह मेटाडेटा प्रोग्रामिंगचे अनेक व्यावहारिक उपयोग आहेत, ज्यात खालील गोष्टींचा समावेश आहे:
- सिरियलायझेशन आणि डिसिरियलायझेशन: प्रॉपर्टीज JSON किंवा इतर फॉरमॅटमध्ये कशा सिरियलाइज किंवा डिसिरियलाइज केल्या जातात हे नियंत्रित करण्यासाठी मेटाडेटासह एनोटेट करा. बाह्य API किंवा डेटाबेसकडून डेटा हाताळताना हे उपयुक्त ठरू शकते, विशेषतः वितरीत प्रणालींमध्ये ज्यांना वेगवेगळ्या प्लॅटफॉर्मवर डेटा परिवर्तनाची आवश्यकता असते (उदा. वेगवेगळ्या प्रादेशिक मानकांनुसार तारीख फॉरमॅट बदलणे). एका ई-कॉमर्स प्लॅटफॉर्मची कल्पना करा जो आंतरराष्ट्रीय शिपिंग पत्त्यांशी व्यवहार करतो, जिथे तुम्ही प्रत्येक देशासाठी योग्य पत्ता फॉरमॅट आणि प्रमाणीकरण नियम निर्दिष्ट करण्यासाठी मेटाडेटा वापरू शकता.
- डिपेंडेंसी इंजेक्शन: क्लासमध्ये इंजेक्ट करण्याची आवश्यकता असलेल्या डिपेंडेंसी ओळखण्यासाठी मेटाडेटा वापरा. हे डिपेंडेंसीचे व्यवस्थापन सोपे करते आणि लूज कपलिंगला प्रोत्साहन देते. एका मायक्रो सर्व्हिसेस आर्किटेक्चरचा विचार करा जिथे सेवा एकमेकांवर अवलंबून असतात. डेकोरेटर्स आणि मेटाडेटा कॉन्फिगरेशनवर आधारित सर्व्हिस क्लायंट्सचे डायनॅमिक इंजेक्शन सुलभ करू शकतात, ज्यामुळे सोपे स्केलिंग आणि फॉल्ट टॉलरन्स शक्य होते.
- व्हॅलिडेशन: व्हॅलिडेशन नियम मेटाडेटा म्हणून परिभाषित करा आणि डेटा आपोआप व्हॅलिडेट करण्यासाठी डेकोरेटर्स वापरा. हे डेटाची अखंडता सुनिश्चित करते आणि बॉयलरप्लेट कोड कमी करते. उदाहरणार्थ, एका जागतिक वित्तीय ॲप्लिकेशनला विविध प्रादेशिक आर्थिक नियमांचे पालन करणे आवश्यक आहे. मेटाडेटा वापरकर्त्याच्या स्थानावर आधारित चलन फॉरमॅट, कर गणना आणि व्यवहार मर्यादांसाठी व्हॅलिडेशन नियम परिभाषित करू शकतो, ज्यामुळे स्थानिक कायद्यांचे पालन सुनिश्चित होते.
- राउटिंग आणि मिडलवेअर: वेब ॲप्लिकेशन्ससाठी रूट्स आणि मिडलवेअर परिभाषित करण्यासाठी मेटाडेटा वापरा. हे तुमच्या ॲप्लिकेशनचे कॉन्फिगरेशन सोपे करते आणि ते अधिक सुव्यवस्थित बनवते. एक जागतिक स्तरावर वितरीत कंटेंट डिलिव्हरी नेटवर्क (CDN) कंटेंटचा प्रकार आणि वापरकर्त्याच्या स्थानावर आधारित कॅशिंग धोरणे आणि राउटिंग नियम परिभाषित करण्यासाठी मेटाडेटा वापरू शकते, ज्यामुळे जगभरातील वापरकर्त्यांसाठी कामगिरी ऑप्टिमाइझ होते आणि लेटन्सी कमी होते.
- ऑथोरायझेशन आणि ऑथेंटिकेशन: मेथड्स आणि क्लासेससोबत रोल्स, परवानग्या आणि ऑथेंटिकेशन आवश्यकता जोडा, ज्यामुळे घोषणात्मक सुरक्षा धोरणे सुलभ होतात. एका बहुराष्ट्रीय कॉर्पोरेशनची कल्पना करा ज्यात विविध विभाग आणि ठिकाणी कर्मचारी आहेत. डेकोरेटर्स वापरकर्त्याची भूमिका, विभाग आणि स्थानावर आधारित ॲक्सेस कंट्रोल नियम परिभाषित करू शकतात, ज्यामुळे केवळ अधिकृत कर्मचारीच संवेदनशील डेटा आणि कार्यक्षमतेत प्रवेश करू शकतात याची खात्री होते.
सर्वोत्तम पद्धती
जावास्क्रिप्ट डेकोरेटर्स वापरताना, खालील सर्वोत्तम पद्धतींचा विचार करा:
- डेकोरेटर्स सोपे ठेवा: डेकोरेटर्स केंद्रित असावेत आणि एकच, सु-परिभाषित कार्य करावे. वाचनीयता आणि सुव्यवस्था टिकवून ठेवण्यासाठी डेकोरेटर्समध्ये गुंतागुंतीचे लॉजिक टाळा.
- डेकोरेटर फॅक्टरीज वापरा: कॉन्फिगर करण्यायोग्य डेकोरेटर्ससाठी डेकोरेटर फॅक्टरीज वापरा. यामुळे तुमचे डेकोरेटर्स अधिक लवचिक आणि पुन्हा वापरण्यायोग्य बनतात.
- साईड इफेक्ट्स टाळा: डेकोरेटर्सनी प्रामुख्याने डेकोरेटेड एलिमेंटमध्ये बदल करण्यावर किंवा त्याच्याशी मेटाडेटा जोडण्यावर लक्ष केंद्रित केले पाहिजे. डेकोरेटर्समध्ये गुंतागुंतीचे साईड इफेक्ट्स करणे टाळा ज्यामुळे तुमचा कोड समजण्यास आणि डीबग करण्यास कठीण होऊ शकतो.
- टाइपस्क्रिप्ट वापरा: टाइपस्क्रिप्ट डेकोरेटर्ससाठी उत्कृष्ट समर्थन प्रदान करते, ज्यात टाइप चेकिंग आणि IntelliSense समाविष्ट आहे. टाइपस्क्रिप्ट वापरल्याने तुम्हाला त्रुटी लवकर शोधण्यात आणि तुमचा विकास अनुभव सुधारण्यास मदत होते.
- तुमच्या डेकोरेटर्सचे दस्तऐवजीकरण करा: तुमचे डेकोरेटर्स स्पष्टपणे दस्तऐवजीकरण करा जेणेकरून त्यांचा उद्देश आणि ते कसे वापरावेत हे स्पष्ट होईल. यामुळे इतर विकासकांना तुमचे डेकोरेटर्स समजून घेणे आणि योग्यरित्या वापरणे सोपे होते.
- कार्यक्षमतेचा विचार करा: डेकोरेटर्स शक्तिशाली असले तरी, ते कार्यक्षमतेवर देखील परिणाम करू शकतात. तुमच्या डेकोरेटर्सच्या कार्यक्षमतेच्या परिणामांबद्दल जागरूक रहा, विशेषतः कार्यक्षमता-गंभीर ॲप्लिकेशन्समध्ये.
डेकोरेटर्ससह आंतरराष्ट्रीयीकरणाची उदाहरणे
डेकोरेटर्स आंतरराष्ट्रीयीकरण (i18n) आणि स्थानिकीकरण (l10n) मध्ये कोड घटकांना स्थान-विशिष्ट डेटा आणि वर्तन जोडून मदत करू शकतात:
उदाहरण: स्थानिक तारीख स्वरूपन
import 'reflect-metadata';
interface DateFormatOptions {
locale: string;
options?: Intl.DateTimeFormatOptions;
}
const dateFormatKey = 'dateFormat';
function formatDate(options: DateFormatOptions) {
return function(target: any, propertyKey: string) {
Reflect.defineMetadata(dateFormatKey, options, target, propertyKey);
};
}
class Event {
@formatDate({ locale: 'fr-FR', options: { year: 'numeric', month: 'long', day: 'numeric' } })
startDate: Date;
constructor(startDate: Date) {
this.startDate = startDate;
}
getFormattedStartDate(): string {
const options: DateFormatOptions = Reflect.getMetadata(dateFormatKey, Object.getPrototypeOf(this), 'startDate');
return this.startDate.toLocaleDateString(options.locale, options.options);
}
}
const event = new Event(new Date());
console.log(event.getFormattedStartDate()); // फ्रेंच फॉरमॅटमध्ये तारीख आउटपुट करते
उदाहरण: वापरकर्त्याच्या स्थानावर आधारित चलन स्वरूपन
import 'reflect-metadata';
interface CurrencyFormatOptions {
locale: string;
currency: string;
}
const currencyFormatKey = 'currencyFormat';
function formatCurrency(options: CurrencyFormatOptions) {
return function(target: any, propertyKey: string) {
Reflect.defineMetadata(currencyFormatKey, options, target, propertyKey);
};
}
class Product {
@formatCurrency({ locale: 'de-DE', currency: 'EUR' })
price: number;
constructor(price: number) {
this.price = price;
}
getFormattedPrice(): string {
const options: CurrencyFormatOptions = Reflect.getMetadata(currencyFormatKey, Object.getPrototypeOf(this), 'price');
return this.price.toLocaleString(options.locale, { style: 'currency', currency: options.currency });
}
}
const product = new Product(99.99);
console.log(product.getFormattedPrice()); // जर्मन युरो फॉरमॅटमध्ये किंमत आउटपुट करते
भविष्यातील विचार
जावास्क्रिप्ट डेकोरेटर्स हे एक विकसित होणारे वैशिष्ट्य आहे आणि त्याचे मानक अजूनही विकासाधीन आहे. काही भविष्यातील विचारांमध्ये हे समाविष्ट आहे:
- मानकीकरण: डेकोरेटर्ससाठी ECMAScript मानक अजूनही प्रगतीपथावर आहे. जसे मानक विकसित होईल, तसे डेकोरेटर्सच्या सिंटॅक्स आणि वर्तनात बदल होऊ शकतात.
- कार्यक्षमता ऑप्टिमायझेशन: जसे डेकोरेटर्स अधिक व्यापकपणे वापरले जातील, तसे ॲप्लिकेशनच्या कार्यक्षमतेवर नकारात्मक परिणाम होणार नाही याची खात्री करण्यासाठी कार्यक्षमता ऑप्टिमायझेशनची आवश्यकता असेल.
- टूलिंग सपोर्ट: डेकोरेटर्ससाठी सुधारित टूलिंग सपोर्ट, जसे की IDE एकत्रीकरण आणि डीबगिंग टूल्स, विकासकांना डेकोरेटर्स प्रभावीपणे वापरणे सोपे करेल.
निष्कर्ष
जावास्क्रिप्ट डेकोरेटर्स हे मेटाडेटा प्रोग्रामिंगची अंमलबजावणी करण्यासाठी आणि तुमच्या कोडच्या वर्तनात वाढ करण्यासाठी एक शक्तिशाली साधन आहे. डेकोरेटर्स वापरून, तुम्ही स्वच्छ, घोषणात्मक आणि पुन्हा वापरण्यायोग्य पद्धतीने कार्यक्षमता जोडू शकता. यामुळे अधिक सुव्यवस्थित, चाचणी करण्यायोग्य आणि स्केलेबल कोड तयार होतो. आधुनिक जावास्क्रिप्ट विकासासाठी डेकोरेटर्सचे विविध प्रकार आणि त्यांचा प्रभावीपणे वापर कसा करायचा हे समजून घेणे आवश्यक आहे. डेकोरेटर्स, विशेषतः रिफ्लेक्ट मेटाडेटा API सोबत वापरल्यास, डिपेंडेंसी इंजेक्शन आणि व्हॅलिडेशनपासून ते सिरियलायझेशन आणि राउटिंगपर्यंत अनेक शक्यता उघड करतात, ज्यामुळे तुमचा कोड अधिक अर्थपूर्ण आणि व्यवस्थापित करण्यास सोपा होतो.